<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Object.assign()方法</title>
  </head>
  <body></body>
  <script>
    // Object.assign() 方法
    // 用于对象的合并，将目标对象的可枚举属性复制、扩展到源对象，并返回修改后的源对象
    // origin = Object.assign(origin, target1, target2, ...)

    let origin1 = { a: 1, c: 20 };
    let target1 = { b: 2, c: 30 };

    // 如果目标对象与源对象有同名属性，则后面的属性会覆盖前面的属性
    Object.assign(origin1, target1);
    console.log(origin1); // {a: 1, c: 30, b: 2}

    // 如果参数不是对象，则先转为对象再进行合并
    // 也表明只要是可序列化的数值均可作为参数使用
    console.log(Object.assign({}, "abc")); // {0: 'a', 1: 'b', 2: 'c'}

    // 在对源对象进行属性扩展时实现的是浅拷贝
    let origin2 = { a: 1, c: 20 };
    let target2 = { b: 2, c: 30, children: { x: 1000 } };
    Object.assign(origin2, target2);
    console.log(origin2.children); // {x: 1000}
    // 修改 target2 中 children.x 属性值表明为浅拷贝
    target2.children.x = 500;
    console.log(origin2.children); // {x: 500}
  </script>
</html>
